﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Coolite.Ext.Web;
using ENT.GP.Core.Core;
using ENT.GP.Core.Rol;
using entgp.Code;
using ENT.GP.Core.Mail;
using ENT.GP.Core;
using System.Xml;
using System.Text.RegularExpressions;
using System.Security.Permissions;
using System.IO;

namespace entgp.Usuarios
{
    public partial class wucRoles : System.Web.UI.UserControl
    {
        XmlDocument xmlLoadMenu = new XmlDocument();
        protected string sSiglasCodigoRol = ""; 
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {

            }
        }
        
        internal void Mostrar(string operacion,int id)
        {
           

            hidOperacion.SetValue(operacion);
            hidId.SetValue(id);
            this.treePanelMenu.Root.Clear();
            if (operacion=="Editar")
            {
                   Rol objRol = Rol.GetRol(id);
                   txtNombre.SetValue(objRol.Nombre);
                   txtDescripcion.SetValue(objRol.Nombre);
                   txtCodigo.SetValue(objRol.Codigo);
                   this.hidCodigo.Value = objRol.Codigo;

            }

            this.CallUpdateXml(this.hidCodigo.Value.ToString(), operacion);
            this.hidCodigo.Value = "";
            this.tabOpciones.Activate("0");
            winMiCuenta.Show();
        }
        [FileIOPermission(SecurityAction.Demand, Write = @"C:\")]
        protected void btnGuardar_Click(object sender, AjaxEventArgs e)
        {
            try
            {    
                
                Rol rol=null;
                int id;
                int.TryParse(hidId.Text, out id);
                if (hidOperacion.Text == "Editar")
                {
                    rol = Rol.GetRol(id);
                    this.hidCodigo.Value = rol.Codigo;
                }

                else if (hidOperacion.Text == "Nuevo")
                {
                    rol = Rol.NewRol();
                    string siglas = txtNombre.Text.Substring(0, 3);
                    siglas = siglas.ToUpper();
                    string siglasTest = "";
                    while (siglasTest == "")
                    {
                        Random r = new Random(50);
                        if (!Rol.VerificarCodigo(siglas))
                        {
                            siglasTest = siglas;
                        }
                        else
                        {
                            siglas = siglas.Substring(0, 2) + r.Next().ToString();
                            siglas = siglas.Substring(0, 3) ;
                        }
                    }
                    rol.Codigo = siglasTest;

                }
                rol.Nombre = txtNombre.Text;
                rol.Descripcion = txtDescripcion.Text;
                //rol.Codigo    = this.hidCodigo.Value.ToString();
                rol.IdRol       = id;

                //         
                String nodesCheck =e.ExtraParams["ItemTreeNode"];
                CallCreateXml(nodesCheck, rol.Codigo, hidOperacion.Text);
                rol = rol.Save();
                UtilP.MostrarNotificacion("El rol se guardo correctamente","Registro de Roles",MessageBox.Icon.INFO );
                winMiCuenta.Hide();
                 
           
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.Message);
            }
        }
        protected void txtNombre_Change(object sender, AjaxEventArgs e)
        {
            try
            {
               
                if (Rol.VerificarRol(txtNombre.Text))
                {
                       UtilP.MostrarNotificacion("El rol ya existe", "Registro de Roles", MessageBox.Icon.WARNING);
                       txtNombre.Text = "";
                }
               

            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.Message);
            }
        }

        private void CallUpdateXml(string file, string operacion)
        {
           
            string ruta = "";
            //Lectura del xml
            ruta = string.Format("{0}/resources/arbol{1}.xml", ConfigurationManager.AppSettings.Get("SD"), "TPL");
            XmlDocument xmlTemplateMenu = new XmlDocument();
            xmlTemplateMenu.Load(HttpContext.Current.Server.MapPath(ruta));
            XmlNodeList modulos = xmlTemplateMenu.GetElementsByTagName("nodo");

            XmlAttribute pAttribute = xmlTemplateMenu.CreateAttribute("checked");
            XmlNode nodeParent = xmlTemplateMenu.SelectSingleNode("//nodos/nodo");
            if (operacion == "Nuevo")
            {
                pAttribute.Value = "false";
                nodeParent.Attributes.Append(pAttribute);
            }
            else
            {
                ruta = string.Format("{0}/resources/arbol{1}.xml", ConfigurationManager.AppSettings.Get("SD"), file);
                XmlDocument xmlReadEdit = new XmlDocument();
                string valueXml = File.ReadAllText(HttpContext.Current.Server.MapPath(ruta));
                xmlReadEdit.LoadXml(valueXml);
                modulos = modulos[0].ChildNodes;
                //
                pAttribute.Value = "true";
                nodeParent.Attributes.Append(pAttribute);
                if (modulos.Count != 0)
                {
                   
                    foreach (XmlElement modulo in modulos)
                    {
                        XmlNodeList listamodulos = modulo.ChildNodes;
                        foreach (XmlElement nodoshijos1 in listamodulos)
                        {

                            string sTmp = nodoshijos1.GetAttribute("idnodo");

                            string sSeek = "//nodos/nodo/nodo/*[@idnodo='" + sTmp + "']";
                            XmlNode nodoClild = xmlReadEdit.SelectSingleNode(sSeek);
                            pAttribute = xmlTemplateMenu.CreateAttribute("checked");

                            if (nodoClild != null)
                            {
                                pAttribute.Value = "true";
                            }
                            else
                            {
                                pAttribute.Value = "false";
                            }
                            nodoshijos1.Attributes.Append(pAttribute);

                        }

                    }
                }
               
            }

            ruta = string.Format("../resources/arbol{0}.xml", "TPL");
            ruta = Server.MapPath(ruta);
            xmlTemplateMenu.Save(ruta);
        }


        private void CallCreateXml(string tn,string file,string op)
        {
            string xml  = "";
            string ruta = "";
           
            //Lectura del xml
            ruta = string.Format("{0}/resources/arbol{1}.xml", ConfigurationManager.AppSettings.Get("SD"), "TPL");
            XmlDocument xmlLoadMenu = new XmlDocument();
            xmlLoadMenu.Load(HttpContext.Current.Server.MapPath(ruta));

            XmlDocument newlXml   = new XmlDocument();
            //
            XmlNode nodeRoot      = newlXml.CreateElement("nodos");
            XmlNode newNodeParent = null;

            

          
            //XmlNode frtLoadNodeParent = xmlLoadMenu.SelectSingleNode("//nodos/frontal/modulos");
            XmlNode frtNewNodeParent  = null;
            XmlDocument frtXml = new XmlDocument();
            if (op == "Nuevo")
            {
                xml = @"<?xml version='1.0' encoding='utf-8'?>
                      <nodos>
                               <nodo idnodo='n00001' nombre='Navegador' url='' idpadre=''>
                               </nodo>
                      </nodos>";
                newlXml.LoadXml(xml);
                newNodeParent = newlXml.SelectSingleNode("//nodos/nodo");


                //Creacion frontal
                xml = @"<?xml version='1.0' encoding='utf-8'?>
                      <nodos>
                           <nodo id='n0001' nombre='Principal' url='' >
                                <nodo id='n1002'  nombre='Módulos' url='' idpadre='n0001'>
                                </nodo>
                           </nodo> 
                      </nodos>";
               
                frtXml.LoadXml(xml);
                frtNewNodeParent = frtXml.SelectSingleNode("//nodos/nodo/nodo");
            }
            else
            {

                ruta = string.Format("{0}/resources/frontal{1}.xml", ConfigurationManager.AppSettings.Get("SD"), file);
                xml = File.ReadAllText(HttpContext.Current.Server.MapPath(ruta));
                frtXml.LoadXml(xml);
                frtNewNodeParent = frtXml.SelectSingleNode("//nodos/nodo/nodo");
                frtNewNodeParent.RemoveAll();
                setXmlAttribute(frtXml, frtNewNodeParent, "id", "n1002");
                setXmlAttribute(frtXml, frtNewNodeParent, "nombre", "Módulos");
                setXmlAttribute(frtXml, frtNewNodeParent, "url", "");
                setXmlAttribute(frtXml, frtNewNodeParent, "idpadre", "n0001");

                //
                ruta = string.Format("{0}/resources/arbol{1}.xml", ConfigurationManager.AppSettings.Get("SD"), file);
                xml = File.ReadAllText(HttpContext.Current.Server.MapPath(ruta));
                newlXml.LoadXml(xml);
                newlXml.RemoveAll(); 
                //
                newNodeParent = newlXml.CreateElement("nodo");
                setXmlAttribute(newlXml, newNodeParent, "idnodo", "n00001");
                setXmlAttribute(newlXml, newNodeParent, "nombre", "Navegador");
                setXmlAttribute(newlXml, newNodeParent, "url", "");
                setXmlAttribute(newlXml, newNodeParent, "idpadre", "");
               


            } 
            // [Node n2001]
            string[] myIdsTree = tn.Split(',');
            //<nodo idnodo="n0005" nombre="Modulo Georeferencial" url="" idpadre="n0001">
            //<nodo idnodo="ncb001" nombre="Ubicacion Proyectos" url="/entgp/Georeferencial/Mapas.aspx" idpadre="n0005" />
            //</nodo>
            foreach (string id in myIdsTree)
            {

                string sTmp = id.Substring(6);
                sTmp = sTmp.Substring(0, sTmp.Length - 1);
                string sSeek = "//nodos/nodo/nodo/*[@idnodo='" + sTmp + "']";
                XmlNode nodoClild = xmlLoadMenu.SelectSingleNode(sSeek);
               
                XmlNode nodeTmp = newlXml.CreateElement("nodo");

                sSeek = "//*[@idnodo='" + nodoClild.Attributes["idpadre"].Value + "']";

                XmlNode seekNewRoot = newNodeParent.SelectSingleNode(sSeek);
                if (seekNewRoot==null)
                {
                    sSeek = "//nodos/nodo/*[@idnodo='" + nodoClild.Attributes["idpadre"].Value + "']";
                    XmlNode nodoRoot = xmlLoadMenu.SelectSingleNode(sSeek);
                    setXmlAttibute(newlXml, nodeTmp, nodoRoot);
                    seekNewRoot = newNodeParent.AppendChild(nodeTmp);
                    
                    sSeek = "//nodos/frontal/modulos/*[@id='" + nodoClild.Attributes["idpadre"].Value + "']";
                    //nodos de frontal
                    nodeTmp = frtXml.CreateElement("nodo");
                    nodoRoot = xmlLoadMenu.SelectSingleNode(sSeek);
                    if (nodoRoot != null)
                    {
                        setXmlAttibute(frtXml, nodeTmp, nodoRoot);
                        frtNewNodeParent.AppendChild(nodeTmp);
                    }
                    //
                    nodeTmp = newlXml.CreateElement("nodo");
                }
                
                setXmlAttibute(newlXml, nodeTmp, nodoClild);
                seekNewRoot.AppendChild(nodeTmp);
                
            }
            if (op == "Editar")
            {
                nodeRoot.AppendChild(newNodeParent);
                newlXml.AppendChild(nodeRoot);
            }
            ruta = string.Format("../resources/arbol{0}.xml",  file);
            ruta = Server.MapPath(ruta);
            // Save the document to a file and auto-indent the output.
            XmlTextWriter writer = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            writer.Formatting = Formatting.Indented;
            newlXml.Save(writer);
            writer.Close();

            //save frontal
            ruta = string.Format("../resources/frontal{0}.xml", file);
            ruta = Server.MapPath(ruta);
            // Save the document to a file and auto-indent the output.
            writer = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            writer.Formatting = Formatting.Indented;
            frtXml.Save(writer);
            writer.Close();



        }
        //
        private static XmlAttribute setXmlAttribute(XmlDocument newlXml, XmlNode newNodeParent,string sNombre,string sValue)
        {
            XmlAttribute tmpAttribute = newlXml.CreateAttribute(sNombre);
            tmpAttribute.Value = sValue;
            newNodeParent.Attributes.Append(tmpAttribute);
            return tmpAttribute;
        }

        private static void setXmlAttibute(XmlDocument newlXml, XmlNode nodeTmp, XmlNode nodoRoot)
        {
            if (nodoRoot != null)
                foreach (XmlAttribute att in nodoRoot.Attributes)
                {
                    XmlAttribute pAttribute = newlXml.CreateAttribute(att.Name);
                    pAttribute.Value = att.Value;
                    nodeTmp.Attributes.Append(pAttribute);
                }
                      
        }

      
    }
}